#include <54func.h>
int main(int argc,char *argv[])
{
// ./1_aqiang_udp 192.168.187.128 1234
    ARGS_CHECK(argc,3);

    int sockfd = socket(AF_INET,SOCK_DGRAM,0); 
    ERROR_CHECK(sockfd,-1,"socker");

    //初始化
    struct sockaddr_in serveraddr;
    serveraddr.sin_family = AF_INET;
    serveraddr.sin_port = htons(atoi(argv[2]));
    serveraddr.sin_addr.s_addr = inet_addr(argv[1]);

    //bind：绑定
    int ret = bind(sockfd,(struct sockaddr *)&serveraddr,sizeof(serveraddr));
    ERROR_CHECK(ret,-1,"bind");

    char buf[4096] = {0};
    //第一次是客户端给服务端发送连接，从而让服务端获取客户端的ip以及端口
    struct sockaddr_in clientaddr;
    socklen_t addrlen = sizeof(clientaddr);
    recvfrom(sockfd,buf,sizeof(buf),0,(struct sockaddr *)&clientaddr,&addrlen);
    printf("client：%s,ip：%s,prot：%d\n",buf,
                inet_ntoa(clientaddr.sin_addr),//将主机字节序转换为网络字节序
                      ntohs(clientaddr.sin_port));
    //UDP与TCP还是有很多不同的，若是你一段的断行没有发出去，则会直接丢包
    //并且当你UDP的聊天是没有连接的，因此当服务端想要发消息给客户端需要带上客户端的ip以及prot
    //第一次信息发送必须由客户端发送，随后服务端便可记录客户端的ip以及prot
   
    
    //监听
    fd_set rdset;
    while(1)
    {
        FD_ZERO(&rdset);
        FD_SET(STDIN_FILENO,&rdset);
        FD_SET(sockfd,&rdset);
        select(sockfd+1,&rdset,NULL,NULL,NULL);
        //select返回，则说明stdin or sockfd就绪
        if(FD_ISSET(STDIN_FILENO,&rdset))
        {
            //服务器发送消息给客户端
            bzero(buf,sizeof(buf));
            ssize_t sret = read(STDIN_FILENO,buf,sizeof(buf));
            if(sret == 0)
            {
                //若是读取到0字节数据，则说明我想断开连接，是我主动
                sendto(sockfd,buf,0,0,
                       (struct sockaddr *)&clientaddr,sizeof(clientaddr));
                printf("azhen主动断开连接！\n");
                break;
            }
            sendto(sockfd,buf,strlen(buf),0,
                          (struct sockaddr *)&clientaddr,sizeof(clientaddr));
            
        }
        if(FD_ISSET(sockfd,&rdset))
        {
            //客户端发来消息了
            bzero(buf,sizeof(buf));
            ssize_t sret = recvfrom(sockfd,buf,sizeof(buf),0,NULL,NULL);
            if(sret == 0)
            {
                //读取到0字节数据，说明对方想断开连接
                //printf("aqiang主动断开连接！\n");
                break;
            }
            printf("client：%s\n",buf);
        }
        
    }
    
    return 0;

}
